package _220312;

import java.util.Scanner;

/**
 * @author ShadowLim
 * @create 2022-03-12-9:22
 */

/**
 *  参考链接：https://blog.csdn.net/SAMSARS/article/details/115794369
 *  Hash+拉链法
 *  我们知道三个数相加被k整除可以等价于三个数各个数对k取余后的结果可以被k整除，简单点来说就是
 *  ( a + b + c ) % k 等 价 于 ( a % k + b % k + c % k ) % k
 *  也就是说当我们已经知道前两个数a和b时，其实第三个数的范围我们已经知道了，可以利用公式
 *  c = ( k − a % k + k − b % k ) % k
 *
 *  也就是说c对k取余后的数是固定的。
 *  则我们可以用二维数组group[k][3]来维护余数为0~k-1的最大的三个数。再用双层循环遍历已经剪枝后的数，可以得到正确答案。
 *
 */

public class _倍数问题 {
    static int n, k, a, b, c;   // a b c：选中的三个数
    static int max = 0;
    static int[][] group = new int[1000][3];    // 分组

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        k = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        f(arr);
        System.out.println(max);
    }

    /**
     *  输入
     *  4 3
     *  1 2 3 4
     *
     *  输出
     *  9
     * @param arr
     */

    private static void f(int[] arr) {
        for (int i = 0; i < n; i++) {
            int x = arr[i];     // 1 2 3 4
            int rest = x % k;  // 余数 用来分组    1,2,3,4 mod 3 == 1,2,0,1
            // 维护每个分组中最大的三个数
            if (x > group[rest][0]) {   // 1 > group[1][0] 2 > group[2][0] 3 > group[0][0] 4 > group[1][0]
                group[rest][2] = group[rest][1];
                group[rest][1] = group[rest][0];
                group[rest][0] = x;
                // group[1][0] = 1 group[2][0] = 2  group[0][0] = 3  group[1][0] = 4 (1 --> 4 从1变到4)
            } else if (x > group[rest][1]) {
                group[rest][2] = group[rest][1];
                group[rest][1] = x;
            } else if (x > group[rest][2]) {
                group[rest][2] = x;
            }
        }
        for (int i = 0; i < k; i++) {   // (a 的余数: i) 按照余数枚举第一组
            for (int j = 0; j < k; j++) {   // (b 的余数: j)  按照余数枚举第二组
                // ( a + b + c ) % k 等 价 于 ( a % k + b % k + c % k ) % k
                // 类似：a + b + c = d 求第三个数 则 d - a - b = c
                int thirdMod = (k - i + k - j) % k;     // 得到第三个余数这三个余数凑为k的倍数
                a = group[i][0];    // group[0][0] 是 0 group[0][0]还是0 ???
                if (i == j) {   // 0 = 0  0 != 1
                    b = group[i][1];    // group[0[1]也是0
                    if (i == thirdMod) {    // 现在的thirdMod为2 不相等
                        c = group[i][2];
                    } else {
                        c = group[thirdMod][0]; // c = group[2][0] (2)
                    }
                } else {
                    b = group[j][0];    // b = group[1][0] = 4
                    if (i == thirdMod) {   // 0 != 2
                        c = group[i][1];
                    } else if (j == thirdMod){ // 1 != 2
                        c = group[j][1];
                    } else {    // c = group[2][0] = 2
                        c = group[thirdMod][0];
                    }
                }
                if (a + b + c > max) {  // 0 + 0 + 2 > max 0 + 4 + 2 > 2 max = 6
                    max = a + b + c;
                }
            }
        }
    }
}
